package main

import (
	"fmt"
	"log"
	"path/filepath"

	"go-file-perception-model/internal/repository"
)

func main() {
	fmt.Println("=== SQLite数据库数据验证工具 ===")

	// 检查SQLite数据库
	cwd, err := filepath.Abs(".")
	if err != nil {
		log.Fatalf("无法获取当前工作目录: %v", err)
	}
	
	dbPath := filepath.Join(cwd, "data", "file_monitor.db")
	fmt.Printf("数据库路径: %s\n\n", dbPath)
	
	fileMonitorRepo, err := repository.NewFileMonitorRepository(dbPath)
	if err != nil {
		log.Fatalf("无法连接SQLite数据库: %v", err)
	}

	// 列出所有目录记录
	directories, err := fileMonitorRepo.ListAllDirectoryRecords()
	if err != nil {
		log.Fatalf("无法获取目录记录: %v", err)
	}

	if len(directories) == 0 {
		fmt.Println("❌ 没有找到任何目录记录。")
		fmt.Println("这意味着还没有进行过文件索引，或者数据库初始化有问题。")
		return
	}

	fmt.Printf("✅ 找到 %d 个目录记录:\n\n", len(directories))
	
	totalFiles := 0
	totalIndexedFiles := 0
	
	for i, dir := range directories {
		fmt.Printf("目录 %d:\n", i+1)
		fmt.Printf("  路径: %s\n", dir.DirectoryPath)
		fmt.Printf("  目录名: %s\n", dir.DirectoryName)
		fmt.Printf("  集合名称: %s\n", dir.CollectionName)
		fmt.Printf("  总文件数: %d\n", dir.TotalFiles)
		fmt.Printf("  已索引文件数: %d\n", dir.IndexedFiles)
		fmt.Printf("  是否监控中: %v\n", dir.IsMonitoring)
		fmt.Printf("  最后扫描时间: %s\n", dir.LastScanTime.Format("2006-01-02 15:04:05"))
		fmt.Printf("  最后索引时间: %s\n", dir.LastIndexedTime.Format("2006-01-02 15:04:05"))
		fmt.Printf("  创建时间: %s\n", dir.CreatedAt.Format("2006-01-02 15:04:05"))
		
		totalFiles += dir.TotalFiles
		totalIndexedFiles += dir.IndexedFiles
		
		// 获取该目录下的文件记录
		files, err := fileMonitorRepo.GetFileRecordsByDirectoryID(dir.ID)
		if err != nil {
			fmt.Printf("  ❌ 错误: 无法获取文件记录: %v\n", err)
		} else {
			fmt.Printf("  文件记录数: %d\n", len(files))
			indexedCount := 0
			for _, file := range files {
				if file.IsIndexed {
					indexedCount++
				}
			}
			fmt.Printf("  实际已索引文件数: %d\n", indexedCount)
			
			// 显示前5个文件的详细信息
			if len(files) > 0 {
				fmt.Printf("  文件示例:\n")
				maxShow := 5
				if len(files) < maxShow {
					maxShow = len(files)
				}
				for j := 0; j < maxShow; j++ {
					file := files[j]
					status := "❌ 未索引"
					if file.IsIndexed {
						status = "✅ 已索引"
					}
					fmt.Printf("    %d. %s (%s)\n", j+1, file.FileName, status)
					if file.IsIndexed {
						fmt.Printf("       索引时间: %s\n", file.IndexedAt.Format("2006-01-02 15:04:05"))
					}
				}
				if len(files) > maxShow {
					fmt.Printf("    ... 还有 %d 个文件\n", len(files)-maxShow)
				}
			}
		}
		
		fmt.Println()
	}

	// 总结
	fmt.Println("=== 总结 ===")
	fmt.Printf("总目录数: %d\n", len(directories))
	fmt.Printf("总文件数: %d\n", totalFiles)
	fmt.Printf("已索引文件数: %d\n", totalIndexedFiles)
	
	if totalIndexedFiles > 0 {
		fmt.Printf("索引完成率: %.1f%%\n", float64(totalIndexedFiles)/float64(totalFiles)*100)
		fmt.Println("\n✅ SQLite数据库中有索引记录！")
		fmt.Println("这表明文件已经被处理过，分块数据应该已经存储到向量数据库中。")
		fmt.Println("\n每个目录对应的向量数据库集合名称已显示在上面。")
		fmt.Println("如果您需要验证向量数据库中的实际数据，请确保:")
		fmt.Println("1. Qdrant服务正在运行")
		fmt.Println("2. 使用正确的端口和认证信息")
		fmt.Println("3. 查看正确的集合名称")
	} else {
		fmt.Println("\n❌ 没有找到已索引的文件。")
		fmt.Println("可能的原因:")
		fmt.Println("1. 索引过程尚未完成")
		fmt.Println("2. 索引过程中出现错误")
		fmt.Println("3. 嵌入模型服务不可用")
	}
	
	fmt.Println("\n=== 验证完成 ===")
}